#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QWidget>
#include <QPushButton>
#include <QPainter>
#include <QBrush>
#include <QPen>
#include <QrectF>
#include <QRadialGradient>
#include <QKeyEvent>
#include <QVector>
#include <ctime>
#include <QDebug>
#include <QTimer>
#include<QMessageBox>
#include <QList>
#include <QPoint>
#include <QLabel>
#include <QFont>
#include <QSpinBox>
#include <QPixmap>


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
protected:
    void paintEvent(QPaintEvent *event) override;//绘制主界面
    void keyPressEvent(QKeyEvent *event) override;//键盘事件

signals:
    void scorechanged();//分数改变的信号

private slots:
    void moveDown();//方块下落
    void newPiece();//生成新方块
    void clearLines();//消除满行
    void onstartbuttonclicked();//开始
    void onstopbuttonclicked();//暂停
    void onoverbuttonclicked();//结束
    void ongamemodebuttonclicked();//选择游戏模式
    void updatescorelabel();//更新分数显示
    void gamedifficultychanged(int value);//更新游戏难度

private:
//整体布局
    QWidget *mainwidget;
    QGraphicsView *graphicsview;
    QGraphicsScene *scene;
    QGraphicsView *nextgraphicsview;
    QGraphicsScene *nextscene;
    QWidget *buttonwidget;
    QLabel *scorelabel;
    QSpinBox *gamedifficulty;
    QPushButton *gamemodebutton;
    QPushButton *startbutton;
    QPushButton *stopbutton;
    QPushButton *overbutton;
//常量
    static const int BOARD_WIDTH=20;//界面宽
    static const int BOARD_HEIGHT=25;//界面高
    static const int BLOCK_SIZE=30;//方块大小
    int UPDATE_INTERVAL=1000;//下落速度
//逻辑实现
    QTimer *gameTimer;//计时下落
    QVector<QVector<QColor>> gameBoard;//储存已固定方块
    QColor currentColor;//生成方块颜色
    QColor nextColor;//下一个方块颜色
    QVector<QPoint> currentShape;//生成方块形状
    QVector<QPoint> nextShape;//下一个方块形状
    QVector<QVector<QVector<QPoint>>> SHAPES;//全部方块形状
    QVector<QVector<QVector<QPoint>>> SHAPES1;//低能模式
    QVector<QVector<QVector<QPoint>>> SHAPES2;//简单模式
    QVector<QVector<QVector<QPoint>>> SHAPES3;//普通模式
    QVector<QVector<QVector<QPoint>>> SHAPES4;//困难模式
    QVector<QVector<QVector<QPoint>>> SHAPES5;//杂交模式
    int currentRotation;//生成方块旋转状态
    int currentType;//生成方块类型
    int nextRotation;//下一个方块旋转状态
    int nextType;//下一个方块类型
    int score;//得分
//逻辑实现方法
    bool tryMove(const QVector<QPoint> &newShape);//确保方块正常移动
    void fixToBoard();//固定方块
    void rotateShape();//旋转方块
    void tryMoveShape(int dx, int dy);//左右移动方块
    void updateScene();//更新绘制游戏场景
    void updatenextScene();//更新下一个方块显示

};
#endif // WIDGET_H
